package org.ala.tiktools.rpc.kcp.protocol;

import io.netty.buffer.ByteBuf;

import java.util.List;

/**
 * kcp协议层定义
 *
 * @author ala
 * @date 2025-04-11 09:05
 */
public interface IKcp {
    /**
     *  消息头长度（24字节）
     */
    public static final int IKCP_OVERHEAD = 24;

    /**
     * cmd: push data
     */
    public static final byte IKCP_CMD_PUSH = 81;
    /**
     * cmd: ack
     */
    public static final byte IKCP_CMD_ACK = 82;
    /**
     * cmd: window probe (ask)
     */
    public static final byte IKCP_CMD_WASK = 83;
    /**
     * cmd: window size (tell)
     */
    public static final byte IKCP_CMD_WINS = 84;


    /**
     * need to send IKCP_CMD_WASK
     */
    public static final int IKCP_ASK_SEND = 1;
    /**
     * need to send IKCP_CMD_WINS
     */
    public static final int IKCP_ASK_TELL = 2;



    /**
     *  从rcvQue中读取1个完整消息（rcvQue -> buf）
     *  <p> 完了根据rcvWnd大小从 rcvBuf -> rcvQue
     *  @return -1:rcvQue为空 | -2:rcvQue中还没收到一个完整消息 | -3:buf容量不够 | >0:读取的字节数
     */
    int recv(ByteBuf buf);
    /**
     *  从rcvQue中读取1个完整消息（rcvQue[i].data -> bufs）
     *  <p> 完了根据rcvWnd大小从 rcvBuf -> rcvQue
     *  @return -1:rcvQue为空 | -2:rcvQue中还没收到一个完整消息 | >0:读取的字节数
     */
    int recv(List<ByteBuf> bufs);
    /**
     *  读取数据到rcvBuf中
     */
    int input(ByteBuf buf);


    /**
     *  发送数据包
     */
    int send(ByteBuf buf);
    /**
     *  将sndBuf中的数据发送出去
     */
    void flush();
    /**
     *  检测是否可执行flush
     */
    boolean checkFlush();
    /**
     *  触发flush，并计算下次触发时间
     */
    void update(int current);
    /**
     *  校验并返回合适的触发时间戳
     */
    int check(int current);


    /**
     *  释放
     */
    void release();
}
